package com.cheney.common.sensitive.handler;

import ch.qos.logback.classic.spi.ILoggingEvent;

/**
 * 脱敏器
 */
public interface LogbackMessageHandler {

    /**
     * 是否支持脱敏
     * <ul>
     *     <li>若是编写脱敏器，那么此方法可直接返回true</li>
     *     <li>若是编写插件，那么可通过控制此方法的返回值，来控制插件作用范围</li>
     * </ul>
     *
     * @param event 日志事件<br/> 你可能需要用到：
     *              <ul>
     *                  <li>
     *                      获取日志上下文 - {@link ILoggingEvent#getMDCPropertyMap()}<br/>
     *                      你可以通过操作{@link org.slf4j.MDC#put(String, String)}，在编写你的项目时，往日志上下文中存放必要的信息
     *                  </li>
     *                  <li>
     *                      你可以通过调用{@link ILoggingEvent#getMessage()}未被解析时的日志内容<br/>
     *                      你可以通过调用{@link ILoggingEvent#getArgumentArray()}获取日志参数<br/>
     *                      你可以通过调用{@link ILoggingEvent#getFormattedMessage()}获取解析后的完整的日志内容<br/>
     *                  </li>
     *                  <li>获取loggerName(一般为logger所属类的全类名) - {@link ILoggingEvent#getLoggerName()}</li>
     *                  <li>......</li>
     *              </ul>
     * @return 是否支持脱敏
     */
    boolean support(final ILoggingEvent event);

    /**
     * 脱敏
     *
     * @param event   日志信息对象<br>
     *                这里面有很多信息，你可能并不都关注；对于常用的Message，已经从此对象{@link ILoggingEvent#getMessage()}出来作为此方法的第二个参数
     * @param message 日志信息对象
     * @param buffer  日志信息容器，用于存放最终的日志
     */
    void desensitize(final ILoggingEvent event, final String message, final StringBuilder buffer);
}
